Vibe算法简介、优缺点、代码 | 您所在的位置:网站首页 › summer vibe 什么意思 › Vibe算法简介、优缺点、代码 |
ViBe检测方法
算法简介
1.背景模型的初始化
2.前景检测过程
3.背景模型的更新方法
Vibe算法优缺点
Vibe代码
算法简介
该算法采用邻域像素来创建背景模型,通过比对背景模型和当前输入像素值来检测前景。总的来说就是先背景建模,后前景检测的背景差方法。 具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。 vibe算法可以分为以下三个步骤。 1.背景模型的初始化初始化单帧图像中每个像素点的背景模型。假设每一个像素和其邻域像素的像素值在空域上有相似的分布。基于这种假设,每一个像素模型都可以用其邻域中的像素来表示。为了保证背景模型符合统计学规律,邻域的范围要足够大。 对于一个像素点,随机的选择它的邻居点的像素值作为它的模型样本值。M0(x)=v0(y|y∈NG(x)),t=0初始时刻,NG(x)即为邻居点 。 2.前景检测过程对后续的图像序列进行前景目标分割操作。 背景模型为每个背景点存储一个样本集,然后每个新的像素值和样本集比较判断是否属于背景。像素点(x,y)的背景模型为,像素值为。按照下面判断该像素值是否为前景。 这里上标r是随机选的;T是预先设置好的阈值。当 满足符合背景#N次时,我们认为像素点 为背景,否则为前景。 3.背景模型的更新方法ViBe算法的更新在时间和空间上都具有随机性。时间上的随机性。在N个背景模型中随机抽取一个,设为图像Pg。当我们得到新的一帧图像Pt时,如果图像Pt中的x位置对应的像素Pt(x)被判断为背景,则Pg需要被更新。这个抽取的过程体现了时间上的随机性。空间上的随机性。在Pg(x)的八邻域中随机抽取一个像素Pg(r),用Pg(r)的来替换掉Pg(x),这体现了模型更新空间上的随机性。 Vibe算法优缺点优点: 内存占用少,一个像素需要作一次比较,占用一个字节的内存; 无参数法; 性能优于混合高斯,参数化方法,SACON等; 像素级算法,视频处理中的预处理关键步骤; 背景模型及时初始化; 具有较好的抗噪能力; 在背景建模中,不仅减少了背景模型建立的过程,还可以处理背景突然变化的情况,当检测到背景突然变化明显时,只需要舍弃原始的模型,重新利用变化后的首帧图像建立背景模型; 在背景模型更新中,采用八邻域更新的方法,可以去除由于获取的视频细微抖动(摄像机抖动、目标微动)而产生的重影和误差,让检测目标更加准确。缺点: 在背景建模中,由于可能采用了运动物体的像素初始化样本集,容易引入Ghost区域(拖影、鬼影区域)(Ghost区域也就是指当一个原本静止的物体开始运动,背景差检测算法可能会将原来该物体所覆盖的区域错误的检测为运动的,这块区域就成为Ghost,当然原来运动的物体变为静止的也会引入Ghost区域,Ghost区域在检测中必须被尽快的消除。)Ghost区域如下图所示; 静止目标问题,长时间驻留未运动,该人物运动目标逐渐被背景吸收。 阴影前景问题,阴影的存在导致检测出来的运动目标形状不准确,影响后续目标分类、跟踪、识别和分析等其他智能视频处理模块。产生阴影前景问题的根源是:光线被运动目标前景遮挡,投射阴影区的颜色比背景的颜色暗,即阴影和背景颜色值的距离相差较大,背景差分后被误检为运动目标前景。 运动目标不完整问题,运动目标通常可分为非刚性物体和刚性物体,人属于非刚性物体,车属于刚性物体,这两种常见检测对象的检测结果都出现了不完整现象。 Vibe代码Vibe.h头文件 #include #include #include using namespace cv; using namespace std; //每个像素点的样本个数默认值 #define DEFAULT_NUM_SAMPLES 20 //#min指数默认值 #define DEFAULT_MIN_MATCHES 2 //Sqthere半径默认值 #define DEFAULT_RADIUS 20 //子采样概率默认值 #define DEFAULT_RANDOM_SAMPLE 16 class ViBe { public: ViBe(int num_sam = DEFAULT_NUM_SAMPLES, int min_match = DEFAULT_MIN_MATCHES, int r = DEFAULT_RADIUS, int rand_sam = DEFAULT_RANDOM_SAMPLE); ~ViBe(void); //背景模型初始化 void init(Mat img); //处理第一帧图像 void ProcessFirstFrame(Mat img); //运行ViBe算法,提取前景区域并更新背景模型样本库 void Run(Mat img); //获取前景模型二值图像 Mat getFGModel(); //删除样本库 void deleteSamples(); //x的邻居点 int c_xoff[9]; //y的邻居点 int c_yoff[9]; private: //样本库 unsigned char*** samples; //前景模型二值图像 Mat FGModel; //每个像素点的样本个数 int num_samples; //#min指数 int num_min_matches; //Sqthere半径 int radius; //子采样概率 int random_sample; }; #pragma onceVibe.cpp #include"Vibe.h" /* 构造函数ViBe 参数: int num_sam:每个像素点的样本个数 int min_match:#min 指数 int r: Sqthere 半径 int rand_sam:子采样概率 */ ViBe::ViBe(int num_sam, int min_match, int r, int rand_sam) { num_samples = num_sam; num_min_matches |
CopyRight 2018-2019 实验室设备网 版权所有 |